import org.junit.jupiter.api.Test;

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class DurationDemo {
    /**
     * ZERO：时间长度为零的常数。
     */
    @Test
    public void test01(){
        System.out.println(Duration.ZERO); // 输出 PT0S
    }
}

class DurationDemo01 {

    /**
     * parse(CharSequence text)
     * 作用：将字符串解析成duration对象。字符串格式如下：
     *     "PT20.34S"  -- 解析成 20.34秒
     *     "PT15M"     -- 解析成 15分钟
     *     "PT10H"     -- 解析成 10小时
     *     "P2D"       -- 解析成 2天
     *     "P2DT3H4M"  -- 解析成 2天3小时4分钟
     *     "P-6H3M"    -- 解析成 负6小时正3分钟
     *     "-P6H3M"    -- 解析成 负6小时负3分钟
     *     "-P-6H+3M"  -- 解析成 正6小时负3分钟
     */
    @Test
    public void test01(){
        System.out.println(Duration.parse("PT1S")); // 输出 PT1S
        System.out.println(Duration.parse("PT1M")); // 输出 PT1M
        System.out.println(Duration.parse("PT1H")); // 输出 PT1H
    }

    /**
     * between(Temporal startInclusive, Temporal endExclusive)
     * 作用：计算两个时间点之间相差的秒数或纳秒数。
     */
    @Test
    public void test02() {
        LocalDateTime startDateTime = LocalDateTime.parse("2023-04-02T08:00:00.001");
        LocalDateTime endDateTime = LocalDateTime.parse("2023-04-02T09:00:00.002");
        Duration duration01 = Duration.between(startDateTime, endDateTime);
        System.out.println(duration01); // 输出 PT1H0.001S
    }

    /**
     * of(long amount, TemporalUnit unit)
     * ofDays(long days)
     * ofHours(long hours)
     * ofMinutes(long minutes)
     * ofSeconds(long seconds)
     * ofSeconds(long seconds, long nanoAdjustment)
     * ofMillis(long millis)
     * ofNanos(long nanos)
     * 作用：指定时间长度创建duration对象。
     */
    @Test
    public void test03() {
        Duration duration01 = Duration.of(1, ChronoUnit.SECONDS);
        Duration duration02 = Duration.of(1, ChronoUnit.MINUTES);
        Duration duration03 = Duration.of(1, ChronoUnit.HOURS);
        System.out.println(duration01); // 输出 PT1S
        System.out.println(duration02); // 输出 PT1M
        System.out.println(duration03); // 输出 PT1H

        Duration duration04 = Duration.ofSeconds(1);
        Duration duration05 = Duration.ofMinutes(1);
        Duration duration06 = Duration.ofHours(1);
        System.out.println(duration04); // 输出 PT1S
        System.out.println(duration05); // 输出 PT1M
        System.out.println(duration06); // 输出 PT1H

        Duration duration07 = Duration.ofSeconds(1, 15);
        System.out.println(duration07); // 输出 PT1.000000015S
    }
}

class DurationDemo02 {

    /**
     * abs()
     * 作用：返回duration对象的绝对值。
     *
     * negated()
     * 作用：返回duration对象的相反数。
     */
    @Test
    public void test01(){
        LocalDateTime startDateTime = LocalDateTime.parse("2023-04-02T08:00:00");
        LocalDateTime endDateTime = LocalDateTime.parse("2023-04-02T09:00:00");
        Duration duration01 = Duration.between(endDateTime, startDateTime);
        Duration duration02 = Duration.between(startDateTime, endDateTime);
        System.out.println(duration01.getSeconds()); // 输出 -3600
        System.out.println(duration01.abs().getSeconds()); // 输出 3600
        System.out.println(duration02.negated().getSeconds()); // 输出 -3600
    }

    /**
     * addTo(Temporal temporal)
     * subtractFrom(Temporal temporal)
     * 作用：在其它时间对象上 加上/减去 duration对象的时间长度。
     */
    @Test
    public void test02(){
        LocalDateTime dateTime01 = LocalDateTime.parse("2023-04-02T09:00:00");
        Duration duration01 = Duration.ofHours(1).plusMinutes(15);
        LocalDateTime dateTime02 = (LocalDateTime) duration01.addTo(dateTime01);
        LocalDateTime dateTime03 = (LocalDateTime) duration01.subtractFrom(dateTime01);
        System.out.println(dateTime01); // 输出 2023-04-02T09:00
        System.out.println(dateTime02); // 输出 2023-04-02T10:15
        System.out.println(dateTime03); // 输出 2023-04-02T07:45
    }

    /**
     * compareTo(Duration otherDuration)
     * 作用：对比两个duration对象。
     */
    @Test
    public void test03(){
        Duration duration01 = Duration.ofHours(1).plusMinutes(15);
        Duration duration02 = Duration.ofHours(1);
        System.out.println(duration01.compareTo(duration02)); // 输出 1
    }

    /**
     * multipliedBy(long multiplicand)
     * dividedBy(long divisor)
     * 作用：将duration对象的时间长度 扩大/缩小 指定倍数。
     */
    @Test
    public void test04(){
        Duration duration01 = Duration.ofSeconds(100);
        System.out.println(duration01.getSeconds()); // 输出 100
        System.out.println(duration01.multipliedBy(10).getSeconds()); // 输出 1000
        System.out.println(duration01.dividedBy(10).getSeconds()); // 输出 10
    }

    /**
     * getUnits()
     * 作用：获取duration对象支持的时间单位。
     */
    @Test
    public void test05(){
        Duration duration01 = Duration.ofSeconds(45, 100);
        System.out.println(duration01.getUnits()); // 输出 [Seconds, Nanos]
    }

    /**
     * isNegative()
     * 作用：判断duration对象的时间长度是否是负值。
     * 
     * isZero()
     * 作用：判读duration对象的时间长度是否为零。
     */
    @Test
    public void test06(){
        Duration duration01 = Duration.ofSeconds(45);
        Duration duration02 = Duration.ofSeconds(-45);
        Duration duration03 = Duration.ofSeconds(0);
        System.out.println(duration01.isNegative()); // 输出 false
        System.out.println(duration02.isNegative()); // 输出 true
        System.out.println(duration02.isZero()); // 输出 false
        System.out.println(duration03.isZero()); // 输出 true
    }

    /**
     * toDays()
     * toHours()
     * toMinutes()
     * toMillis()
     * toNanos()
     * 作用：将时间长度用天、小时、分、秒等方式表示。
     */
    @Test
    public void test07(){
        Duration duration01 = Duration.ofDays(2);
        System.out.println(duration01.toDays()); // 输出 2
        System.out.println(duration01.toHours()); // 输出 48
        System.out.println(duration01.toMinutes()); // 输出 2880
    }
}